mssql

推荐列表 站点导航

当前位置:首页 > 数据库 > mssql >

基于SQL Server中如何比较两个表的各组数据 图解说明

来源:网络整理  作者:网络  发布时间:2020-12-13 00:46
本篇文章小编为大家介绍,基于SQL Server中如何比较两个表的各组数据 图解说明。需要的朋友参考下...

完整代码:

针对方法1,需要对原表增加一个字段dataPath,用于存储data列数据连串的结果,如:

检查表table_left的各组(groupId),是否在表table_right中存在有一组(groupId)数据(data)与它的数据(data)完全相等.

cross apply(select (select '-'+x.data from table_right x where x.groupId=a.groupId order by x.data for xml path('')) as dataPath)b
select '#3','data92' union all

基于SQL Server中如何比较两个表的各组数据 图解说明

分析

select '#5','data77' union all
select '#11','data2' union all
View Code

use tempdb

where exists(select 1 from table_right x where x.dataPath=a.dataPath)
select '#4','data65' union all
set dataPath=b.dataPath


from table_left a

分组连串data列数据并update至刚新增的列dataPath,如:


复制代码 代码如下:

create table table_right(groupId nvarchar(5),data nvarchar(10))
cross apply(select (select '-'+x.data from table_left x where x.groupId=a.groupId order by x.data for xml path('')) as dataPath)b
update a
select '#1','data1' union all
select '#33','data99' union all
from table_left a
set nocount on
if object_id('table_right') is not null drop table table_right

方法2:

select '#2','data55' union all
go
select '#1','data3' union all
select '#2','data55' union all

go

在数据库中,要找出表table_left和表table_right存在相同数据的组,方法很多,这里我列出两种常用的方法。

select '#1','data2' union all

复制代码 代码如下:

go
if object_id('table_left') is not null drop table table_left
select '#4','data67' union all
set dataPath=b.dataPath
select '#5','data79'

from table_left a

go

select '#55','data77' union all

基于SQL Server中如何比较两个表的各组数据 图解说明

cross apply(select (select '-'+x.data from table_right x where x.groupId=a.groupId order by x.data for xml path('')) as dataPath)b
select '#22','data57' union all
select '#4','data66' union all
from table_right a

复制代码 代码如下:

insert into table_right(groupId,data)

图3.

select distinct a.groupId

select distinct a.groupId

(下面的SQL脚本,是以图4.的数据为基础参考)

图2.

通过SQL Sever提供的集运算符"Except",判断两组非重复的数据。如果两组针对对方都不存在非重复的数据,就说明这两组数据完全相等。如,表table_left中的组#11和表 table_right中的组#1,对列data进行"Except"集运算,无任是(#11 à #1)进行Except集运算,还是(#1 à #11 )进行Except集合运算,都返回空结果,这就说明组#1 和#11的data数据完全相等,如:

create nonclustered index ix_left on table_left(dataPath)
select '#44','data68' union all
insert into table_left(groupId,data)

通过"Select … From …Order by … xml for path('') "把各组的data列数据连串起来(如,图4.把table_left的组#11的列data连串起来成"data1-data2-data3"),其他分组(包含表table_right)以此方法实现data列数据连串起来;然后通过比较两表的连串后字段是否存在相等,若是相等就说明这比较多两组数据相等,由此可以判断出表table_left的哪组数据在表table_right存在与它数据完全相等的组。

select '#33','data99' union all
set dataPath=b.dataPath

复制代码 代码如下:

create table table_left(groupId nvarchar(5),data nvarchar(10))
where exists(select 1 from table_right x where x.dataPath=a.dataPath)
cross apply(select (select '-'+x.data from table_left x where x.groupId=a.groupId order by x.data for xml path('')) as dataPath)b

基于SQL Server中如何比较两个表的各组数据 图解说明

select '#55','data78' union all

前一阵子,在项目中碰到这样一个SQL查询需求,有两个相同结构的表(table_left & table_right),如下:

from table_left a
update a
select '#4','data69' union all
--

从上面的两个表,可以知道它们存放的是一组一组的数据;那么,接下来我借助数学集合的列举法和运算进行分析。

如图1. 可以看出表table_left和table_right存在两组数据完整相等:

update a


图1.

方法1:

alter table table_left add dataPath nvarchar(200)
select '#55','data79'

先通过集合的列举法描述两个表的各组数据:

select '#11','data1' union all

图4.

update a

go

基于SQL Server中如何比较两个表的各组数据 图解说明

go
set dataPath=b.dataPath

接下来就是查询了,如:

from table_right a
select '#4','data68' union all
select '#22','data55' union all
select '#3','data91' union all


create nonclustered index ix_right on table_right(dataPath)

实现

复制代码 代码如下:

alter table table_right add dataPath nvarchar(200)
select '#44','data66' union all
select '#11','data3' union all

alter table table_left add dataPath nvarchar(200)
go
alter table table_right add dataPath nvarchar(200)

这里只有两种情况,相等和不相等。对于不相等,可再分为部分相等、包含、和完全不相等。使用集合描述,可使用交集,子集,并集。如下面图4.,我列举出这几种常见的情况:

相关热词:

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!

本文地址: https://v30.fanwenzhu.com/sql/mssql/3120.shtml

Copyright © www.juheyunku.com      关于 | 合作 | 声明 | 联系 | 更新 | 地图 | Tags

基于SQL Server中如何比较两个表的各组数据 图解说明

2020-12-13 编辑:网络

完整代码:

针对方法1,需要对原表增加一个字段dataPath,用于存储data列数据连串的结果,如:

检查表table_left的各组(groupId),是否在表table_right中存在有一组(groupId)数据(data)与它的数据(data)完全相等.

cross apply(select (select '-'+x.data from table_right x where x.groupId=a.groupId order by x.data for xml path('')) as dataPath)b
select '#3','data92' union all

基于SQL Server中如何比较两个表的各组数据 图解说明

分析

select '#5','data77' union all
select '#11','data2' union all
View Code

use tempdb

where exists(select 1 from table_right x where x.dataPath=a.dataPath)
select '#4','data65' union all
set dataPath=b.dataPath


from table_left a

分组连串data列数据并update至刚新增的列dataPath,如:


复制代码 代码如下:

create table table_right(groupId nvarchar(5),data nvarchar(10))
cross apply(select (select '-'+x.data from table_left x where x.groupId=a.groupId order by x.data for xml path('')) as dataPath)b
update a
select '#1','data1' union all
select '#33','data99' union all
from table_left a
set nocount on
if object_id('table_right') is not null drop table table_right

方法2:

select '#2','data55' union all
go
select '#1','data3' union all
select '#2','data55' union all

go

在数据库中,要找出表table_left和表table_right存在相同数据的组,方法很多,这里我列出两种常用的方法。

select '#1','data2' union all

复制代码 代码如下:

go
if object_id('table_left') is not null drop table table_left
select '#4','data67' union all
set dataPath=b.dataPath
select '#5','data79'

from table_left a

go

select '#55','data77' union all

基于SQL Server中如何比较两个表的各组数据 图解说明

cross apply(select (select '-'+x.data from table_right x where x.groupId=a.groupId order by x.data for xml path('')) as dataPath)b
select '#22','data57' union all
select '#4','data66' union all
from table_right a

复制代码 代码如下:

insert into table_right(groupId,data)

图3.

select distinct a.groupId

select distinct a.groupId

(下面的SQL脚本,是以图4.的数据为基础参考)

图2.

通过SQL Sever提供的集运算符"Except",判断两组非重复的数据。如果两组针对对方都不存在非重复的数据,就说明这两组数据完全相等。如,表table_left中的组#11和表 table_right中的组#1,对列data进行"Except"集运算,无任是(#11 à #1)进行Except集运算,还是(#1 à #11 )进行Except集合运算,都返回空结果,这就说明组#1 和#11的data数据完全相等,如:

create nonclustered index ix_left on table_left(dataPath)
select '#44','data68' union all
insert into table_left(groupId,data)

通过"Select … From …Order by … xml for path('') "把各组的data列数据连串起来(如,图4.把table_left的组#11的列data连串起来成"data1-data2-data3"),其他分组(包含表table_right)以此方法实现data列数据连串起来;然后通过比较两表的连串后字段是否存在相等,若是相等就说明这比较多两组数据相等,由此可以判断出表table_left的哪组数据在表table_right存在与它数据完全相等的组。

select '#33','data99' union all
set dataPath=b.dataPath

复制代码 代码如下:

create table table_left(groupId nvarchar(5),data nvarchar(10))
where exists(select 1 from table_right x where x.dataPath=a.dataPath)
cross apply(select (select '-'+x.data from table_left x where x.groupId=a.groupId order by x.data for xml path('')) as dataPath)b

基于SQL Server中如何比较两个表的各组数据 图解说明

select '#55','data78' union all

前一阵子,在项目中碰到这样一个SQL查询需求,有两个相同结构的表(table_left & table_right),如下:

from table_left a
update a
select '#4','data69' union all
--

从上面的两个表,可以知道它们存放的是一组一组的数据;那么,接下来我借助数学集合的列举法和运算进行分析。

如图1. 可以看出表table_left和table_right存在两组数据完整相等:

update a


图1.

方法1:

alter table table_left add dataPath nvarchar(200)
select '#55','data79'

先通过集合的列举法描述两个表的各组数据:

select '#11','data1' union all

图4.

update a

go

基于SQL Server中如何比较两个表的各组数据 图解说明

go
set dataPath=b.dataPath

接下来就是查询了,如:

from table_right a
select '#4','data68' union all
select '#22','data55' union all
select '#3','data91' union all


create nonclustered index ix_right on table_right(dataPath)

实现

复制代码 代码如下:

alter table table_right add dataPath nvarchar(200)
select '#44','data66' union all
select '#11','data3' union all

alter table table_left add dataPath nvarchar(200)
go
alter table table_right add dataPath nvarchar(200)

这里只有两种情况,相等和不相等。对于不相等,可再分为部分相等、包含、和完全不相等。使用集合描述,可使用交集,子集,并集。如下面图4.,我列举出这几种常见的情况:

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供学习参考!
本文地址为 https://v30.fanwenzhu.com/sql/mssql/3120.shtml

相关文章

风云图片

推荐阅读

返回mssql频道首页